package com.fare.taluo.util.flightInfo;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;

import com.fare.taluo.vo.core.PlaneInfo;

/**
 * 对一系列的FlightInfo 进行排序的工具类
 * @author Administrator
 *
 */
public class FlightInfoSortUtil {
	
	private static PriceComparator comparator=new PriceComparator();
	private static PriceComparatorHigh comparatorHight=new PriceComparatorHigh();
	
	/**
	 * 根据指定的date时间段划分出每天最低价的数据，顺序和dates一致，如果没有数据那天就是null
	 * 
	 * @param infos
	 * @param dates(起飞时间)
	 * @param periods
	 * @return
	 */
	public static  List<PlaneInfo> generatePlaneInfosOrderByFlightBatch(List<PlaneInfo> infos,List<String> dates){
		return _generatePlaneInfosOrderByFlightBatch(infos, dates, null);
	}
	/**
	 * 根据指定的date时间段划分出每天最低价的数据，顺序和dates一致，如果没有数据那天就是null
	 * 结合业务需要，还需要过滤出非当天抓取的数据
	 * @param infos
	 * @param dates（起飞时间）
	 * @param periods
	 * @return
	 */
	public static  List<PlaneInfo> generatePlaneInfosInTodayCrawlOrderByFlightBatch(List<PlaneInfo> infos,List<String> dates){
		return _generatePlaneInfosOrderByFlightBatch(infos, dates, getTodayStr());
	}
	
	public static List<PlaneInfo> getLowestPlaneInfoCabinList(List<PlaneInfo> infos,List<String> dates){
		return _getLowestPlaneInfoCabinList(infos, dates, getTodayStr());
	}
	
	/**
	 * 根据指定的date时间段划分出每天最低价的数据，顺序和dates一致，如果没有数据那天就是null
	 * 结合业务需要，还需要过滤出非当天抓取的数据
	 * @param infos
	 * @param dates（起飞时间）
	 * @param periods
	 * @return
	 */
	public static  List<PlaneInfo> generatePlaneInfosInTodayCrawlOrderByFlightBatchHighestPrice(List<PlaneInfo> infos,List<String> dates){
		return _generatePlaneInfosOrderByFlightBatchHighestPrice(infos, dates, getTodayStr());
	}
	
	/**
	 * 根据指定的date时间段划分出每天最低价的数据，顺序和dates一致，如果没有数据那天就是null
	 * 
	 * @param infos
	 * @param dates(抓取日期)
	 * 
	 * @return
	 */
	public static List<PlaneInfo> generatePlaneInfosOrderByCrawlDate(List<PlaneInfo> infos,List<String> dates){
		List<PlaneInfo> finalResult=new ArrayList<PlaneInfo>();
		List<PlaneInfo> temp=new ArrayList<PlaneInfo>(infos);
		//筛选每一个抓取时间的最低数据
		for(String date:dates){
			List<PlaneInfo> dayData=new ArrayList<PlaneInfo>();//每天的所有数据
			for(PlaneInfo p:temp){
				if(p.getGrapDateStr()!=null && p.getGrapDateStr().substring(0,10).equals(date)){
					dayData.add(p);
				}
			}
			
			if(!dayData.isEmpty()){
				temp.removeAll(dayData);//剔除所有的已经被筛选的数据，这样下次循环会越来越快
				finalResult.add(comparableLowerPrice(dayData));//最低
			}else{
				finalResult.add(null);
			}
		}
		return finalResult;
	}
	
	
	/**
	 * 根据指定的date时间段划分出每天最低价的数据，顺序和dates一致，如果没有数据那天就是null
	 * 
	 * @param infos
	 * @param dates(航班起飞日期)
	 * @param filterCrawlDate 保留的抓取日期，不是这个抓取日期的会被过滤掉
	 * @return
	 */
	private static List<PlaneInfo> _generatePlaneInfosOrderByFlightBatch(List<PlaneInfo> infos,List<String> dates,String filterCrawlDate){
		List<PlaneInfo> finalResult=new ArrayList<PlaneInfo>();
		List<PlaneInfo> temp=new ArrayList<PlaneInfo>(infos);
		//筛选每天的最低数据
		for(String date:dates){
			List<PlaneInfo> dayData=new ArrayList<PlaneInfo>();//每天的所有数据
			for(PlaneInfo p:temp){
				if(p!=null&& p.getFlightBatchDate()!=null && p.getFlightBatchDate().matches("^"+date+".*")){
					/*if(p!=null&& p.getFlightBatchDate()!=null ){*/
					if(filterCrawlDate!=null){
						if( p.getGrapDateStr()!=null && p.getGrapDateStr().matches("^"+filterCrawlDate+".*")){
							/*if( p.getGrapDateStr()!=null ){*/
							dayData.add(p);
						}
					}else{
						dayData.add(p);
					}
				}
			}
			if(!dayData.isEmpty()){
				temp.removeAll(dayData);
				finalResult.add(comparableLowerPrice(dayData));//最低
			}else{
				finalResult.add(null);
			}
		}
		return finalResult;
	}
	private static List<PlaneInfo> _getLowestPlaneInfoCabinList(List<PlaneInfo> infos,List<String> dates,String filterCrawlDate){
		List<PlaneInfo> finalResult=new ArrayList<PlaneInfo>();
		List<PlaneInfo> temp=new ArrayList<PlaneInfo>(infos);
		//筛选每天数据
		for(String date:dates){
			List<PlaneInfo> dayData=new ArrayList<PlaneInfo>();//每天的所有数据
			for(PlaneInfo p:temp){
/*				if( p.getFlightBatchDate()!=null && p.getFlightBatchDate().matches("^"+date+".*")){
*/					if( p.getFlightBatchDate()!=null ){
					if(filterCrawlDate!=null){
/*						if( p.getGrapDateStr()!=null && p.getGrapDateStr().matches("^"+filterCrawlDate+".*")){
*/							if( p.getGrapDateStr()!=null ){
							dayData.add(p);
						}
					}else{
						dayData.add(p);
					}
				}
			}
			if(!dayData.isEmpty()){
				temp.removeAll(dayData);
				finalResult.add(comparableLowerPrice(dayData));//最低
			}else{
				finalResult.add(null);
			}
		}
		return finalResult;
	}
	
	private static List<PlaneInfo> _generatePlaneInfosOrderByFlightBatchHighestPrice(List<PlaneInfo> infos,List<String> dates,String filterCrawlDate){
		List<PlaneInfo> finalResult=new ArrayList<PlaneInfo>();
		List<PlaneInfo> temp=new ArrayList<PlaneInfo>(infos);
		//筛选每天的最低数据
		for(String date:dates){
			List<PlaneInfo> dayData=new ArrayList<PlaneInfo>();//每天的所有数据
			for(PlaneInfo p:temp){
				if(p!=null&& p.getFlightBatchDate()!=null && p.getFlightBatchDate().matches("^"+date+".*")){
					/*if(p!=null&& p.getFlightBatchDate()!=null ){*/
					if(filterCrawlDate!=null){
						if( p.getGrapDateStr()!=null && p.getGrapDateStr().matches("^"+filterCrawlDate+".*")){
						/*	if( p.getGrapDateStr()!=null ){*/
							dayData.add(p);
						}
					}else{
						dayData.add(p);
					}
				}
			}
			if(!dayData.isEmpty()){
				temp.removeAll(dayData);
				finalResult.add(comparableHigherPrice(dayData));//最高
			}else{
				finalResult.add(null);
			}
		}
		return finalResult;
	}
	
	
	
	
	
	
	/**
	 * 得到抓取日期（今天）的时间字符串yyyy-MM-dd
	 * @return
	 */
	private static String getTodayStr(){
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
		return sdf.format(new Date());
		//return "2013-08-13";
	}
	
	
	
	
	/**
	 * 比较航线中的最低价
	 * @param tempList
	 * @return　集合中的最低价对象
	 */
	private  static PlaneInfo comparableLowerPrice(List<PlaneInfo> tempList){
		PlaneInfo finalResult = null;
		if(tempList != null && !tempList.isEmpty()){
			Collections.sort(tempList,comparator);
			finalResult=tempList.get(0);
		}
		return finalResult;
	}
	
	static class PriceComparator implements Comparator<PlaneInfo>{

		@Override
		public int compare(PlaneInfo o1, PlaneInfo o2) {
			Double d1=Double.valueOf(o1.getLowerPrice());
			Double d2=Double.valueOf(o2.getLowerPrice());
			return d1.compareTo(d2);
		}
		
	}
	
	/**
	 * 比较航线中的最低价
	 * @param tempList
	 * @return　集合中的最低价对象
	 */
	private  static PlaneInfo comparableHigherPrice(List<PlaneInfo> tempList){
		PlaneInfo finalResult = null;
		if(tempList != null && !tempList.isEmpty()){
			Collections.sort(tempList,comparatorHight);
			
			finalResult=tempList.get(0);
			//为了方便数据展示，将最高价保存在最低价字段
			finalResult.setLowerPrice(finalResult.getHighPrice());
		}
		return finalResult;
	}
	
	static class PriceComparatorHigh implements Comparator<PlaneInfo>{

		@Override
		public int compare(PlaneInfo o1, PlaneInfo o2) {
			Double d1=Double.valueOf(o1.getHighPrice());
			Double d2=Double.valueOf(o2.getHighPrice());
			return d2.compareTo(d1);
		}
		
	}
}
